package com.adkun.community.aspect;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;

//@Component
//@Aspect
public class AlphaAspect {

    /**
     * execution 固定关键字
     * 第一个* 方法返回值，代表所有方法返回值都可以
     * 包名
     * service.*.* 所有service里组件的所有方法
     * (..) 所有的参数
     */
    @Pointcut("execution(* com.adkun.community.service.*.*(..))")
    public void pointcut() {

    }

    /**
     * 通知
     * 连接点开始做什么？
     * 结束时做什么？
     * 返回数据后做什么？
     * 抛异常做什么？
     */

    // 连接点开始时
    @Before("pointcut()")
    public void before() {
        System.out.println("before");
    }

    @After("pointcut()")
    public void after() {
        System.out.println("after");
    }

    @AfterReturning("pointcut()")
    public void afterReturning() {
        System.out.println("after returning");
    }

    @AfterThrowing("pointcut()")
    public void afterThrowing() {
        System.out.println("after throwing");
    }

    // 即在前面织入逻辑，又在后面织入逻辑
    @Around("pointcut()")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("around before");
        Object obj = joinPoint.proceed(); // 调目标对象被处理那个目标组件方法
        System.out.println("around after");
        return obj;
    }
}
